(function($){           
    $.validity.outputs.bootstrapConcurso = {
    
        // The start function will be called when validation starts.
        // This allows you to prepare the page for validation, for instance
        // you might remove any validation messages that are already on the page.
        start:function() { 
            var errorDivs = $("div.error");
            $('span.help-block', errorDivs).remove();
            errorDivs.removeClass("error");
        },
        
        // The end function is called when validation has concluded.
        // This allows you to flush any buffers or do anything you need to
        // after all of the validators have been called.
        // results will be the results object.
        // results.valid is a boolean representing whether the form is valid.
        // results.errors is an integer of how many errors there are.
        end:function(results) { 
        
        },
        
        // The raise function is called to raise an error for a specific input.
        // The first argument is a jQuery object of the input to raise the error message for.
        // The second argument is the string of the error message.
        raise:function($obj, msg) {
            var span = "<span class='help-block'>" + msg + "</span>";
            $obj.after(span);  
            $obj.parent().parent().addClass("control-group error");
        },
        
        // The raiseAggregate function is similar to the raise function, except that
        // the $obj argument will be a jQuery object of several inputs, 
        // all of which are invalid aggregately.
        raiseAggregate:function($obj, msg){ 
        
        }
    }
})(jQuery);

function showFlash(msj){    
    $("#append-msg").append(' <div class="alert"><button type="button" class="close" data-dismiss="alert">&times;</button><strong>Cuidado!</strong> '+msj+' </div>');
} 

function preparePrototypeTo(tipoElem){
    $('.date').datepicker({
        dateFormat: 'dd/mm/yy'
    });
    
    //inicializo los elementos ya cargdos                                                                                                                             
    customizeViewAndAddRemoveButton($("."+tipoElem+"-cargado"),tipoElem);                                                                 
    $("#add-"+tipoElem).on('click', function(e){
        e.preventDefault();
        var  $addCargo = $("#collection-of-"+tipoElem);
        var prototype = $addCargo.attr('data-prototype');
        var cantElem = $("#"+tipoElem+"-pre-cargados").children().length + $("#apped-"+tipoElem).children().length + 1
        var newForm = prototype.replace(/\$\$name\$\$/g, cantElem);
        var $appedCargos=$('#apped-'+tipoElem);
        addFormTo($appedCargos,newForm,tipoElem) ;                
    });
 
}
function addFormTo($elem, form,tipoElem ){      
    c=$elem;
    var $form =  $($elem.prepend(form));            
    $($form.children()[0]).show('slow')
    $form.find('input.date').datepicker({
        dateFormat: 'dd/mm/yy'
    })
    $elem.find('select').select2({
        formatSearching:function(){
            return "buscando..."
        },
        formatNoMatches:function(){
            return"no encontraos nada"
        }
    });
    customizeViewAndAddRemoveButtonOnAdd($("#apped-"+tipoElem ).find('div.'+tipoElem+'-agregado'),tipoElem);               
}
function customizeViewAndAddRemoveButtonOnAdd($elements,tipoElem){
    $elements.each( function(index,el){
        var $el  = $(this);   
        if(!$el.hasClass('have-remove')){    
            $el.addClass('have-remove');                            
            $el.find('.to-remove').on('click', function(e){
                // prevent the link from creating a "#" on the URL
                e.preventDefault();
                if (confirm('Estas seguro?')) {
                    $el.hide('blind',{},600).remove();
                };           
            });
            $el.find('div input[class="date"]').addClass(tipoElem);               
        }
    });
}
  
function customizeViewAndAddRemoveButton($elements,tipo){                 
    $elements.each( function(index,el){
        var  $el=$(el); 
        $el.children().show();
        var boton = $el.find('a.to-remove').text(' borrar');
        boton.prepend('<i class="icon-trash"> </i>');
        boton.on('click', function(e){
            // prevent the link from creating a "#" on the URL
            e.preventDefault();
            if (confirm('Estas seguro?')) {
                $el.hide('blind',{},600).remove();
            };                                        
        });                                                                          
        $el.find('div input[class="date"]').addClass(tipo);            
    })                                                                      
}


function initializeDatepickerImpugnacion(){
    $( "#ImpugnacionType_fechaRecibida" ).datepicker({           
        changeYear: true,
        numberOfMonths: 2
   
    });
  
    
    $( "#ImpugnacionType_fechaResolucion" ).datepicker({            
        changeYear: true,
        numberOfMonths: 2
   
    });
}


function alertaFechasConcurso(){

    var alertar = false;
    var inicio = {
        date:$.datepicker.parseDate('dd/mm/yy', $("#ConcursoType_fechaInicioExpediente" ).val()), 
        val:$("#ConcursoType_fechaInicioExpediente" ).val()
    };
    var inscripcion = {
        date:$.datepicker.parseDate('dd/mm/yy', $("#ConcursoType_fechaInicioInscripcion" ).val()), 
        val:$("#ConcursoType_fechaInicioInscripcion" ).val()
    };
    var evaluacion = {
        date:$.datepicker.parseDate('dd/mm/yy', $("#ConcursoType_fechaEvaluacion" ).val()), 
        val:$("#ConcursoType_fechaEvaluacion" ).val()
    };
    var acta = {
        date:$.datepicker.parseDate('dd/mm/yy', $("#ConcursoType_fechaEntregaActa" ).val()), 
        val:$("#ConcursoType_fechaEntregaActa" ).val()
    };
    if($("#ConcursoType_fechaCierre" ).length !=0){
        
        var withCierre = true;
        var cierre = {
            date:$.datepicker.parseDate('dd/mm/yy', $("#ConcursoType_fechaCierre" ).val()), 
            val:$("#ConcursoType_fechaCierre" ).val()
        };
    }else{
        var cierre = {
            date:$.datepicker.parseDate('dd/mm/yy', ""), 
            val:""
        };
        
    }
    var v_inicio;
 

    var v_inscripcion =   ((inscripcion.val == "") || (inicio.date < inscripcion.date )); 
    var v_evaluacion =  ((evaluacion.val == "") || (inicio.date <  evaluacion.date )); 
    var v_acta = ((acta.val == "") || (inicio.date < acta.date )); 
    var v_cierre = ((cierre.val == "") || (inicio.date < cierre.date )); 
    
    if(v_inscripcion && v_evaluacion && v_acta && v_cierre && inicio.val != ""){ 
        console.log("inicio valida")
        console.log("if inicio","v_inscripcion",v_inscripcion,"v_evaluacion",v_evaluacion,"v_acta",v_acta,"v_cierre",v_cierre);
    }else{
        console.log("if inicio","v_inscripcion",v_inscripcion,"v_evaluacion",v_evaluacion,"v_acta",v_acta,"v_cierre",v_cierre);
        showFlash("la fecha de inicio debe ser menor a las demas");
        alertar = true;
    }  
    v_inscripcion =   ((inscripcion.val != "") && ((inscripcion.date < cierre.date )))&& (cierre.val != ""); 
    v_evaluacion =  ((evaluacion.val != "")  && ((evaluacion.date < cierre.date )))&&(cierre.val != ""); 
    v_acta = ((acta.val != "") && ((acta.date < cierre.date ))) && (cierre.val != ""); 
    v_inicio = ((inicio.val != "") && ((cierre.date > inicio.date ))) && (cierre.val != ""); 
    
    if((v_inscripcion && v_evaluacion && v_acta && v_inicio || (cierre.val == ""))){        
        console.log("cierre valida")
    } else{
        
        
        console.log('adentro cierre',"cierre. es blanco",(cierre.val == ""),"v_inscripcion", v_inscripcion ,"v_evaluacion", v_evaluacion, "v_acta" , v_acta , "v_inicio",v_inicio );
        showFlash("la fecha de cierre debe ser mayor a las demas");
        alertar = true;
       
    }
    
 
    return alertar;
}


function initializeDatepickerConcurso(){ 
    $( "#ConcursoType_fechaInicioExpediente" ).datepicker({           
        changeYear: true,
        numberOfMonths: 2,
        onClose: function( selectedDate ) {  
            $( "#ConcursoType_fechaInicioInscripcion" ).datepicker( "option", "minDate", selectedDate );
            $( "#ConcursoType_fechaEntregaActa" ).datepicker( "option", "minDate", selectedDate );
            $( "#ConcursoType_fechaInicioInscripcion" ).datepicker( "option", "minDate", selectedDate );
            $( "#ConcursoType_fechaEvaluacion" ).datepicker( "option", "minDate", selectedDate );
        }
    });    
    $( "#ConcursoType_fechaCierre" ).datepicker({           
        changeYear: true,
        numberOfMonths: 2
    });    
    $( "#ConcursoType_fechaEntregaActa" ).datepicker({
        changeYear: true,
        numberOfMonths: 2
    });
    $( "#ConcursoType_fechaInicioInscripcion" ).datepicker({            
        changeYear: true,
        numberOfMonths: 2
    });
    $( "#ConcursoType_fechaEvaluacion" ).datepicker({            
        changeYear: true,
        numberOfMonths: 2
    });
}

function initializeDatepickerForSearch(){
    var $desde = $('#ConcursoSearchType_virtualSearchFechaDesde');
    var $hasta = $('#ConcursoSearchType_virtualSearchFechaHasta');
    $desde.datepicker({           
        changeYear: true,
        numberOfMonths: 2,
        onClose: function( selectedDate ) {
            $hasta.datepicker( "option", "minDate", selectedDate );
        }
    })
    $hasta.datepicker({            
        changeYear: true,
        numberOfMonths: 2,
        onClose: function( selectedDate ) {
            $desde.datepicker( "option", "maxDate", selectedDate );
        }
    })    
}
Array.prototype.unique=function(a){
    return function(){
        return this.filter(a)
    }
}(function(a,b,c){
    return c.indexOf(a,b+1)<0
});
function validateNewConcurso(){
    $(".close").click();    
        
    $.validity.setup({
        outputMode:"bootstrapConcurso"
    });  
    var selects_asesor = $("select.select_asesor");
    var selects_inscripto = $("select.select_inscripto"); 
    var array_ids = [];
    var resoluciones = [];
    var resoluciones_unique = [];
    var impugnaciones = [];
    var impugnaciones_unique = [];
    $.each($(".resoluciones input.resolucion"), function(index, element){
        resoluciones.push($(element).val());
    })
    $.each($(".impugnaciones input.Expediente"), function(index, element){
        impugnaciones.push($(element).val());
    })
    resoluciones_unique = resoluciones.unique();
    impugnaciones_unique = impugnaciones.unique();
    selects_asesor.each(function(index, element){
        array_ids.push($(element).val());
    });
    selects_inscripto.each(function(index, element){
        array_ids.push($(element).val());
    });
    
    var cuidado = {
        personas_repetidas:'Tiene personas repetidas entre los inscriptos y asesores!',
        resoluciones_repetidas:'Tiene resoluciones con expediente repetidos!',
        impugnaciones_repetidas:'Tiene Impugnaciones con codigo!',
        cargos_obligatorios :'Tiene que seleccionar algun cargo!'
    };
   
                   
    $.validity.start();
    $(".date").match("date","Debe ser una fecha con formato dd/mm/aaaa valido.");
    // $("#ConcursoType_numeroExpediente").require("Es obligatorio").maxLength(4,"maximo 10 caracteres");      
    $(".resolucion").require("Es obligatorio");
    $(":input.Expediente").require("Es obligatorio");
    $("#ConcursoType_numeroExpediente").require("Es obligatorio").match("integer","Debe ser un nro.");
    $(".dateObligatorio").require("Es obligatorio").match("date","Debe ser una fecha con formato dd/mm/aaaa valido.");

    
    if((array_ids.length != array_ids.unique().length))//Personas repetidas
    {         
        console.log("entra en el de personas ");
        showFlash(cuidado.personas_repetidas);
        $("#atach-error-personas").assert(false, "hay repetidos");
    }
    

    
    if((resoluciones.length != resoluciones_unique.length))
    {  
        console.log("entra en el resoluciones");
        showFlash(cuidado.resoluciones_repetidas);
        $("#atach-error-resoluciones").assert(false, "hay repetidos");
    }
    
    if((impugnaciones.length != impugnaciones_unique.length))
    {  
        console.log("entra en el impugnaciones");
        showFlash(cuidado.impugnaciones_repetidas);
        $("#atach-error-impugnaciones").assert(false, "hay repetidos");
    }

    if( $("#ConcursoType_cargos").length && $("#ConcursoType_cargos  option:selected").length == 0){
        console.log("entra en el de cargos");
        showFlash(cuidado.cargos_obligatorios);
        $("#ConcursoType_cargos").assert(false , "Debe seleccionar un cargo!!"); 
    }
    
    $("#atach-fechas-impugnacion").assert(validaImpugnacion(), "No valida las fechas de las imugnaciones");
    
    
    if($("#ConcursoType_fechaInicioExpediente" ).length){
  
        if(alertaFechasConcurso()){
            console.log("entra en el fechas ");
            $("#atach-error-dates").assert(false , "Error con las fechas!!"); 
        }else{
            $("#atach-error-dates").assert(true , "Error con las fechas!!"); 
        }
    }
    
       
 


    
    var result = $.validity.end();
    console.log("form es  valid? ->",result.valid);
 
    return result.valid;
    
}


function getRepetidos(array1, array2){
    var output = [];
    var i = 0;
    jQuery.grep(array2, function(el) {
        if (jQuery.inArray(el, array1) == -1) output.push(el);
        i++;
    });

    $.each(output, function(i,x){
       
        var  id = $(x).attr('id');
        var p =  $(x).find('option:selected').text();
        ///  console.log("select->",x + ' option:selected' );
        console.log("persona->",p );
        console.log("id->",id );
        
    });
    return output;

    
}

function removeAndReRenderSelect($elem,ele ){
    var originalData = $elem.select2('data');
    var newSelecteds =  jQuery.removeFromArray(ele, originalData);
   
    $elem.select2("data", newSelecteds);
  
    
}


function removeEle(ar, el){
    ar = jQuery.removeFromArray(ar,el)
    
}
jQuery.removeFromArray = function(value, arr) {
    return jQuery.grep(arr, function(elem, index) {
        console.log( "elem", elem);
        console.log( "elemid", elem.id);
        if(elem.id !== value){
            console.log("if")
        }else{
            console.log("else")
        }
        
        return elem.id != value;
    });

};



function otraFormaDeEliminarObjetos(originalData){
    $.each(originalData, function(i){
        if(originalData[i].id === '1') originalData.splice(i,1);
    });
}





function validaImpugnacion(){
    $(".impugnaciones-agregado .help-block").remove();
    $(".impugnaciones-agregado .error").removeClass('error');
    var v_valida = true;  
    var msjImpug  = "";
    var recibidaError = {};
    var resolucionError = {};
    var v_codigo = true;
    var codigoError;
    $.each($(".impugnaciones-agregado"), function(i,e){
        var $this = $(e);
        var $index = $this.attr("data-elemtId");
        if($index == "$$name$$"){
            $index = i;
        }
        //        console.log(" $this ",  $this );
        //        console.log(" $index ",  $index );
        if (v_valida){
            var recibida = $("#ConcursoType_impugnaciones_"+ $index +"_fechaRecibida");
            var resolucion = $("#ConcursoType_impugnaciones_"+ $index +"_fechaResolucion");
            recibidaError = recibida;
            resolucionError = resolucion;
            //            console.log("val","#ConcursoType_impugnaciones_"+ $index +"_codigo")
            msjImpug = "Las fechas de la impugnacion codigo #" + $("#ConcursoType_impugnaciones_"+ $index +"_codigo").val()+"  estan mal!"; 
            var impugnacion = {
                f_recibida:$.datepicker.parseDate('dd/mm/yy', recibida.val()),
                v_recibida:recibida.val(),
                f_resolucion:$.datepicker.parseDate('dd/mm/yy', resolucion.val()),
                v_resolucion: resolucion.val()
                        
            }
            console.log("cod",$("#ConcursoType_impugnaciones_"+ $index +"_codigo"))
      
            if( $("#ConcursoType_impugnaciones_"+ $index +"_codigo").val() ==""){
                v_codigo = false;
                codigoError = $("#ConcursoType_impugnaciones_"+ $index +"_codigo") ;
            }
            
            v_valida =(((impugnacion.f_recibida < impugnacion.f_resolucion ) ||(impugnacion.v_resolucion =="")) );
            v_valida = v_valida && (impugnacion.v_recibida !="");
        }else{
            console.log("no valida las fechas de impugnacion");
        
            return;
        }
        
    });
    if(!v_valida){
        showFlash(msjImpug);
        recibidaError.parent().append("<span class='help-block'>Debe ser menor a la Fecha de Resolucion</span>").parent().addClass("control-group error")
        resolucionError.parent().append("<span class='help-block'> Debe ser mayor a la Fecha de Recibida</span>").parent().addClass("control-group error")
        if(!v_codigo){
            codigoError.parent().append("<span class='help-block'>Es obligatorio</span>").parent().addClass("control-group error")
            
        }
    }
    return v_valida;
}


function checkCargos(url){
    var to_go = url.replace(/cargos_ids/g, $("#ConcursoType_cargos").val());
    $.ajax({
        url:to_go,
        type:"post",          
        complete:function(data){
            var result = $.evalJSON(data.responseText);
            if(result.cargos.length > 0){
                $.each(result.cargos, function(index,value){
                    showFlash("El cargo codigo: "+value.codigo + " esta siendo concursado en el concurso con expediente "+ value.numeroExpediente);
                 
                })           
                output = false;
            }else{
                output = true;           
            }
        }
    });
    return true;
}